/**
* Copyright © 2012 Akiban Technologies, Inc. All rights
* reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License v1.0 which
* accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* This program may also be available under different license terms.
* For more information, see www.akiban.com or contact
* licensing@akiban.com.
*
* Contributors:
* Akiban Technologies, Inc.
*/
package com.akiban.sql;
import org.junit.ComparisonFailure;
import org.junit.Ignore;
import static junit.framework.Assert.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.nio.CharBuffer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
@Ignore
public class TestBase
{
protected TestBase() {
}
protected String caseName, sql, expected, error;
protected TestBase(String caseName, String sql, String expected, String error) {
this.caseName = caseName;
this.sql = sql;
this.expected = expected;
this.error = error;
}
public static File[] listSQLFiles(File dir) {
File[] result = dir.listFiles(new RegexFilenameFilter(".*\\.sql"));
Arrays.sort(result, new Comparator<File>() {
public int compare(File f1, File f2) {
return f1.getName().compareTo(f2.getName());
}
});
return result;
}
public static File changeSuffix(File sqlFile, String suffix) {
return new File(sqlFile.getParentFile(),
sqlFile.getName().replace(".sql", suffix));
}
public static String fileContents(File file) throws IOException {
FileReader reader = null;
try {
reader = new FileReader(file);
StringBuilder str = new StringBuilder();
char[] buf = new char[128];
while (true) {
int nc = reader.read(buf);
if (nc < 0) break;
str.append(buf, 0, nc);
}
return str.toString();
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException ex) {
}
}
}
}
public static String[] fileContentsArray(File file) throws IOException {
FileReader reader = null;
List<String> result = new ArrayList<String>();
try {
reader = new FileReader(file);
BufferedReader buffered = new BufferedReader(reader);
while (true) {
String line = buffered.readLine();
if (line == null) break;
result.add(line);
}
}
finally {
if (reader != null) {
try {
reader.close();
}
catch (IOException ex) {
}
}
}
return result.toArray(new String[result.size()]);
}
public static Collection<Object[]> sqlAndExpected(File dir)
throws IOException {
return sqlAndExpected(dir, false);
}
public static Collection<Object[]> sqlAndExpectedAndParams(File dir)
throws IOException {
return sqlAndExpected(dir, true);
}
static final boolean RUN_FAILING_TESTS = Boolean.getBoolean("akiban.sql.test.runFailing");
public static Collection<Object[]> sqlAndExpected(File dir,
boolean andParams)
throws IOException {
Collection<Object[]> result = new ArrayList<Object[]>();
for (File sqlFile : listSQLFiles(dir)) {
String caseName = sqlFile.getName().replace(".sql", "");
if (changeSuffix(sqlFile, ".fail").exists() && !RUN_FAILING_TESTS)
continue;
String sql = fileContents(sqlFile);
String expected, error;
File expectedFile = changeSuffix(sqlFile, ".expected");
if (expectedFile.exists())
expected = fileContents(expectedFile);
else
expected = null;
File errorFile = changeSuffix(sqlFile, ".error");
if (errorFile.exists())
error = fileContents(errorFile);
else
error = null;
if (andParams) {
String[] params = null;
File paramsFile = changeSuffix(sqlFile, ".params");
if (paramsFile.exists()) {
params = fileContentsArray(paramsFile);
}
result.add(new Object[] {
caseName, sql, expected, error, params
});
}
else {
result.add(new Object[] {
caseName, sql, expected, error
});
}
}
return result;
}
/** A class implementing this can call {@link #generateAndCheckResult(). */
public interface GenerateAndCheckResult {
public String generateResult() throws Exception;
public void checkResult(String result) throws IOException;
}
public static void generateAndCheckResult(GenerateAndCheckResult handler,
String caseName,
String expected, String error)
throws Exception {
if ((expected != null) && (error != null)) {
fail(caseName + ": both expected result and expected error specified.");
}
String result = null;
Exception errorResult = null;
try {
result = handler.generateResult();
}
catch (Exception ex) {
errorResult = ex;
}
if (error != null) {
if (errorResult == null)
fail(caseName + ": error expected but none thrown");
else
assertEquals(caseName, error, errorResult.toString());
}
else if (errorResult != null) {
throw errorResult;
}
else if (expected == null) {
fail(caseName + " no expected result given. actual='" + result + "'");
}
else {
handler.checkResult(result);
}
}
/** @see GenerateAndCheckResult */
protected void generateAndCheckResult() throws Exception {
generateAndCheckResult((GenerateAndCheckResult)this, caseName, expected, error);
}
public static void assertEqualsWithoutHashes(String caseName,
String expected, String actual)
throws IOException {
assertEqualsWithoutPattern(caseName,
expected, actual,
CompareWithoutHashes.HASH_REGEX);
}
public static void assertEqualsWithoutPattern(String caseName,
String expected, String actual,
String regex)
throws IOException {
CompareWithoutHashes comparer = new CompareWithoutHashes(regex);
if (!comparer.match(new StringReader(expected), new StringReader(actual)))
throw new ComparisonFailure(caseName, comparer.converter(expected,actual), actual);
}
}